 PAGE
;
*   FLOCK - LOCK A FILE
;
FLOCK LDA #$80  ; REMEMBER LOCK
 STA TEMP3
 BNE LCKGO
;
*   FUNLCK - UNLOCK A FILE
;
FUNLCK LDA #00  ; REMEMBER UNLOCK
 STA TEMP3
;
LCKGO EQU *
;
 JSR DOPEN  ; GO OPEN FILE
 LDX TEMP1
 LDA VDFILE+2,X  ; GET FILE USE CODE
 AND #$7F  ; TURN OFF LOCK
 ORA TEMP3
 STA VDFILE+2,X
 JSR WRVDIR
GOGOOD JMP GOODIO
;
*   FPOSTN - POSITION A FILE
FPOSTN JSR LOCSEC  ; GO POSITION
 JMP GOODIO  ; DONE
;
;
*   FVAR - VARIFY A FILE
;
FVAR EQU *
 JSR DOPEN  ; OPEN FILE
VAR1 JSR LOCNXB  ; READ A SECTOR
 BCS GOGOOD  ; BR IF EOF
 INC DCBCRS  ; INCREMENT SECTOR
 BNE VAR1
 INC DCBCRS+1
 JMP VAR1  ; READ THIS ONE
 PAGE
;
*   FDEL - DELETE A FILE
;
FDEL EQU *
 JSR DOPEN  ; GO OPEN FILE
;
FD2 LDX TEMP1  ; SAVED INDEX
 LDA VDFILE+2,X  ; IS FILE LOCKED
 BPL FD3  ; BR NOT LOCKED
 JMP ERRR10
;
FD3 EQU *
 LDX TEMP1  ; GET SAVED INDEX
 LDA VDFILE,X  ; GET DIR TRACK
 STA DCBFDT  ; SET AS 1ST FD TRACK
 STA VDFILE+32,X  ; SAVE IN LC OF FN
 LDA #$FF  ; DELETED FILE MARKER
 STA VDFILE,X  ; CLEAR ENTRY
 LDY VDFILE+1,X  ; GET DIR SECTOR
 STY DCBFDS  ; SET AS 1ST FD SEC
 JSR WRVDIR  ; GO WRITE VOLUME DIR
 CLC
FD4 JSR RDFDIR  ; GET 1ST FILE DIR SECTOR
 BCS FD7  ; BR IF NO MORE
 JSR MVFCBD  ; MOVE DIR TO ZPG
 LDY #FDENT  ; POINT Y TO 1ST SEC ENT
FD5 STY TEMP1  ; SAVE Y
 LDA (ZPGFCB),Y  ; GET REACK
 BMI FD6  ; BR IF NONE
 BEQ FD6  ; BR IF END OF FILE
 PHA  ; SAVE TRK
 INY
 LDA (ZPGFCB),Y  ; GET SECTOR
 TAY  ; TO Y
 PLA  ; GET TRK
 JSR FDSUB  ; GO FREE SECTOR
FD6 LDY TEMP1  ; GET DIR INDEX
 INY  ; INCR TO NEXT ENTRY
 INY
 BNE FD5  ; BR NOT DONE THIS DIR
 LDA DCBCDT  ; GET THIS DIR TRK
 LDY DCBCDS  ; AND SECTOR
 JSR FDSUB  ; AND GO FREE IT
 SEC  ; GO
 BCS FD4  ; READ NEXT DIR
FD7 EQU *
 JSR WRVTOC
 JMP GOODIO
;
FDSUB EQU *
 SEC  ; SET FOR RE USE OF SEC
 JSR FRESEC  ; GO FREE SECTOR
 LDA #0  ; CLEAR DCB BIT MAP
 LDX #5 ;CLEAR ALL OF TRK BITMAP SO  
*     ;>16 SECTORS/TRK WILL WORK
FDS1 STA DCBALS,X
 DEX
 BPL FDS1
 RTS
 PAGE
;
*   RDIR - PRINT DIRECTORY
;
RDIR EQU *
 JSR DCBSUP
 LDA #$FF
 STA DCBVOL
 JSR RDVTOC
 LDA #22  ; SET 21 LINES
 STA TEMP2
 JSR PRCR  ; GO PRINT
 JSR PRCR  ; PRINT ANOTHER CHAR
 LDX #VML  ; VOLUME MSG LENGTH
RD0 LDA VOLMES,X  ; GET MSG CHAR
 JSR PRINT  ; PRINT IT
 DEX  ; DECREMENT COUNT
 BPL RD0  ; BR IF MORE
;
 STX CNUM+1
 LDA IBSMOD  ; MOVE VOL NO FOR
 STA CNUM  ; CONVERSION
 JSR PRNUM  ; GO PRINT VOL NO
;
 JSR PRCR  ; PRINT CR
 JSR PRCR  ; AND AGAIN
;
 CLC  ; FIRST RECORD
;
RD1 JSR RDVDIR  ; GO READ REC
 BCS RD5
 LDX #0  ; SET INDEX=0
RD2 STX TEMP1  ; SAVE INDEX
 LDA VDFILE,X  ; GET TRACK
 BEQ RD5  ; BR IF END OF DIR
 BMI RD4  ; BR IF DELETED
;
 LDY #$A0  ; BLANK
 LDA VDFILE+2,X  ; GET TYPE
 BPL RD2A  ; BR IF NOT LOCKED
 LDY #'*'+$80  ; AST
RD2A TYA  ; ACU = AST OR BLANK
 JSR PRINT  ; PRINT ACU
;
 LDA VDFILE+2,X  ; GET TYPE
 AND #$7F  ; MASK OUT MISC
 LDY #7  ; SET INDEX = 7
 ASL A  ;GET RID OF HI BIT
RD2B ASL A  ; SHIFT OUT MSB
 BCS RD2C  ; BR IF TYPE BIT OUT
 DEY  ; DEC INDEX
 BNE RD2B  ; BR IF NOT ACC BITS
RD2C EQU *
 LDA FTTAB,Y  ; GET TYPE CODE
 JSR PRINT  ; PRINT IT
 LDA #$A0  ; BLANK
 JSR PRINT  ; PRINT
;
 LDA VDFILE+33,X  ; MOVE FILE LENGTH
 STA CNUM  ; TO CNUM
 LDA VDFILE+34,X
 STA CNUM+1
 JSR PRNUM  ; GO PRINT NUMBER
 LDA #$A0  ; BLANK
 JSR PRINT  ; PRINT
;
 INX
 INX
 INX
 LDY #29
RD3 LDA VDFILE,X  ; GET CHAR
 JSR PRINT  ; PRINT CHAR
 INX
 DEY
 BPL RD3
RD3A EQU *
 JSR PRCR  ; GO PRINT CR
RD4 JSR VDINC  ; INCR INDEX
 BCC RD2  ; BR IF MORE IN DIR
 BCS RD1  ; GO READ NEXT DIR SECT
;
RD5 JMP GOODIO  ; DONE
;
PRCR EQU *
 LDA #$8D  ; CR
 JSR PRINT  ; PRINTED
 DEC TEMP2  ; DEC LINE COUNTER
 BNE PRCR1  ; BR IF NOT ZERO
 JSR GETKEY  ; WAIT FOR INPUT
 LDA #21  ; RESET LINE COUNTER
 STA TEMP2
PRCR1 RTS  ; DONE
 PAGE
PRNUM EQU *
 LDY #2  ; 3 DIGITS
PRN1 LDA #0  ; INIT DIGIT TO ZERO
 PHA  ; SAVE IT
;
PRN2 LDA CNUM  ; GET NUMBER
 CMP CVTAB,Y  ; IF NUM < CVTAB ENTRY
 BCC PRN3  ; THEN DONE THIS DIGIT
;
 SBC CVTAB,Y  ; SUBTRACT TABLE ENTRY
 STA CNUM  ; FROM NUM
 LDA CNUM+1
 SBC #0
 STA CNUM+1
 PLA  ; INCREMENT DIGIT
 ADC #0
 PHA
 JMP PRN2  ; TRY AGAIN
;
PRN3 EQU *
 PLA  ; GET DIGIT
 ORA #$B0  ; ADD ASCII 0
 JSR PRINT  ; PRINT IT
 DEY  ; DECREMENT DIGIT COUNT
 BPL PRN1  ; BR IF MORE DIGIT
;
 RTS  ; DONE
 PAGE
;
*   CLCFCB - GET FCB VIA INDEX AND MOVE IT
;
CLCFCB EQU *
;
 JSR MVFCBP  ; MOVE FCB PTR TO ZPG
 LDY #0
 STY CCBSTA
CF3 LDA (ZPGFCB),Y  ; MOVE FCB TO
 STA FCB,Y  ; FCB WORK AREA
 INY
 CPY #FCBLEN
 BNE CF3
;
 CLC  ; DONE
 RTS
;
*   RTNFCB - MOVE FCB FROM WORK AREA TO FCB
;
RTNFCB EQU *
 JSR MVFCBP  ; MOVE FCB ADR TO ZPG
;
 LDY #0
RF1 LDA FCB,Y
 STA (ZPGFCB),Y
 INY
 CPY #FCBLEN
 BNE RF1
 RTS
